home *** CD-ROM | disk | FTP | other *** search
/ Hardcore Visual Basic 5.0 (2nd Edition) / Hardcore Visual Basic 5.0 - Second Edition (1997)(Microsoft Press).iso / Code / REGITE~1.CLS < prev    next >
Text File  |  1997-06-14  |  3KB  |  112 lines

  1. VERSION 1.0 CLASS
  2. BEGIN
  3.   MultiUse = -1  'True
  4. END
  5. Attribute VB_Name = "CRegItemWalker"
  6. Attribute VB_GlobalNameSpace = False
  7. Attribute VB_Creatable = True
  8. Attribute VB_PredeclaredId = False
  9. Attribute VB_Exposed = True
  10. Option Explicit
  11.  
  12. Public Enum EErrorRegItemWalker
  13.     eeBaseRegItemWalker = 13170 ' CRegItemWalker
  14. End Enum
  15.  
  16. ' Implement Basic-friendly version of IEnumVARIANT
  17. Implements IVariantWalker
  18. ' Delegate to class that implements real IEnumVARIANT
  19. Private vars As CEnumVariant
  20. ' Connect back to parent collection
  21. Private connect As CRegItem
  22.  
  23. ' Private state data
  24. Private iCur As Long
  25.  
  26. Private Sub Class_Initialize()
  27.     ' Initialize position in collection
  28.     iCur = -1
  29.     ' Connect walker to CEnumVariant so it can call methods
  30.     Set vars = New CEnumVariant
  31.     vars.Attach Me
  32. End Sub
  33.  
  34. ' Receive connection from CRegItem
  35. Sub Attach(connectA As CRegItem)
  36.     Set connect = connectA
  37. End Sub
  38.  
  39. ' Return IEnumVARIANT (indirectly) to client collection
  40. Friend Function NewEnum() As stdole.IEnumVARIANT
  41.     Set NewEnum = vars
  42. End Function
  43.  
  44. ' Implement IVariantWalker methods
  45. Private Function IVariantWalker_More(v As Variant) As Boolean
  46.     ' We can't fail in a walker, and yet the registry will return errors
  47.     On Error Resume Next
  48.     iCur = iCur + 1
  49.     Do While iCur < connect.Count
  50.         ' Get next node from registry
  51.         Set v = connect.RegItems(iCur)
  52.         Select Case Err.Number
  53.         Case 0
  54.             ' If more data, return True
  55.             IVariantWalker_More = True
  56.             Exit Function
  57.         Case ApiToCom(ERROR_ACCESS_DENIED)
  58.             ' WinNT returns access error if you don't have permission
  59.             Err.Clear
  60.             iCur = iCur + 1
  61.         Case ApiToCom(ERROR_NO_MORE_ITEMS)
  62.             ' Sometimes happens under WinNT
  63.             iCur = connect.Count
  64.             Err.Clear
  65.             Exit Function
  66.         Case Else
  67.             ' Failure terminates loop, so do only for catastrophies
  68.             Err.Raise Err.Number, Err.Source, Err.Description
  69.         End Select
  70.     Loop
  71. #If 0 Then
  72.     ' Move to next element
  73.     iCur = iCur + 1
  74.     ' If more data, return True and update data
  75.     If iCur < connect.Count Then
  76.         IVariantWalker_More = True
  77.         Set v = connect.RegItems(iCur)
  78.     End If
  79. #End If
  80. End Function
  81.  
  82. Private Sub IVariantWalker_Reset()
  83.     ' Move to first element
  84.     iCur = -1
  85. End Sub
  86.  
  87. Private Sub IVariantWalker_Skip(c As Long)
  88.     ' Skip a given number of elements
  89.     iCur = iCur + c
  90. End Sub
  91.  
  92. #If fComponent = 0 Then
  93. Private Sub ErrRaise(e As Long)
  94.     Dim sText As String, sSource As String
  95.     If e > 1000 Then
  96.         sSource = App.ExeName & ".RegItemWalker"
  97.         Select Case e
  98.         Case eeBaseRegItemWalker
  99.             BugAssert True
  100.        ' Case ee...
  101.        '     Add additional errors
  102.         End Select
  103.         Err.Raise COMError(e), sSource, sText
  104.     Else
  105.         ' Raise standard Visual Basic error
  106.         sSource = App.ExeName & ".VBError"
  107.         Err.Raise e, sSource
  108.     End If
  109. End Sub
  110. #End If
  111.  
  112.